// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:flutter/foundation.dart';
import 'package:flutter_test/flutter_test.dart';

void main() {
  test('Parses line', () {
    expect(
      StackFrame.fromStackTraceLine(stackString.split('\n')[0]),
      stackFrames[0],
    );
  });

  test('Parses string', () {
    expect(
      StackFrame.fromStackString(stackString),
      stackFrames,
    );
  });

  test('Parses StackTrace', () {
    expect(
      StackFrame.fromStackTrace(StackTrace.fromString(stackString)),
      stackFrames,
    );
  });

  test('Parses complex stack', () {
    expect(
      StackFrame.fromStackString(asyncStackString),
      asyncStackFrames,
    );
  });

  test('Parses stack without cols', () {
    expect(
      StackFrame.fromStackString(stackFrameNoCols),
      stackFrameNoColsFrames,
    );
  });

  test('Parses web stack', () {
    expect(
      StackFrame.fromStackString(webStackTrace),
      webStackTraceFrames,
    );
  });

  test('Parses ...',  () {
    expect(
      StackFrame.fromStackTraceLine('...'),
      StackFrame.stackOverFlowElision,
    );
  });

  test('Live handling of Stack Overflows', () {
    void overflow(int seed) {
      overflow(seed + 1);
    }
    bool overflowed = false;
    try {
      overflow(1);
    } on StackOverflowError catch (e, stack) {
      overflowed = true;
      final List<StackFrame> frames = StackFrame.fromStackTrace(stack);
      expect(frames.contains(StackFrame.stackOverFlowElision), true);
    }
    expect(overflowed, true);
  }, skip: isBrowser); // [intended] The VM test harness can handle a
  // stack overflow, but the browser cannot - running this test in a browser
  // will cause it to become unresponsive.

  test('Traces from package:stack_trace throw assertion', () {
    try {
      StackFrame.fromStackString(mangledStackString);
      assert(false, 'StackFrame.fromStackString did not throw on a mangled stack trace');
    } catch (e) {
      expect(e, isA<AssertionError>());
      expect('$e', contains('Got a stack frame from package:stack_trace'));
    }
  });

  test('Can parse web constructor invocation with unknown class name', () {
    const String stackTraceLine = '#32     new (http://localhost:42191/dart-sdk/lib/async/stream_controller.dart:880:9)';
    expect(
      StackFrame.fromStackTraceLine(stackTraceLine),
      const StackFrame(
        number: 32,
        className: '<unknown>',
        method: '',
        packageScheme: 'http',
        package: '<unknown>',
        packagePath: 'dart-sdk/lib/async/stream_controller.dart',
        line: 880,
        column: 9,
        source: stackTraceLine,
      ),
    );
  });

  test('Parses to null for wrong format.', () {
    expect(StackFrame.fromStackTraceLine('wrong stack trace format'), null);
  });
}

const String stackString = '''
#0      _AssertionError._doThrowNew (dart:core-patch/errors_patch.dart:42:39)
#1      _AssertionError._throwNew (dart:core-patch/errors_patch.dart:38:5)
#2      new Text (package:flutter/src/widgets/text.dart:287:10)
#3      _MyHomePageState.build (package:hello_flutter/main.dart:72:16)
#4      StatefulElement.build (package:flutter/src/widgets/framework.dart:4414:27)
#5      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4303:15)
#6      Element.rebuild (package:flutter/src/widgets/framework.dart:4027:5)
#7      ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4286:5)
#8      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4461:11)
#9      ComponentElement.mount (package:flutter/src/widgets/framework.dart:4281:5)
#10     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3276:14)
#11     Element.updateChild (package:flutter/src/widgets/framework.dart)
#12     SingleChildRenderObjectElement.mount (package:flutter/blah.dart:999:9)
#13     main (package:hello_flutter/main.dart:10:4)''';

const List<StackFrame> stackFrames = <StackFrame>[
  StackFrame(number: 0,  className: '_AssertionError',                method: '_doThrowNew',    packageScheme: 'dart',    package: 'core-patch',    packagePath: 'errors_patch.dart',          line: 42,   column: 39,                      source: '#0      _AssertionError._doThrowNew (dart:core-patch/errors_patch.dart:42:39)'),
  StackFrame(number: 1,  className: '_AssertionError',                method: '_throwNew',      packageScheme: 'dart',    package: 'core-patch',    packagePath: 'errors_patch.dart',          line: 38,   column: 5,                       source: '#1      _AssertionError._throwNew (dart:core-patch/errors_patch.dart:38:5)'),
  StackFrame(number: 2,  className: 'Text',                           method: '',               packageScheme: 'package', package: 'flutter',       packagePath: 'src/widgets/text.dart',      line: 287,  column: 10, isConstructor: true, source: '#2      new Text (package:flutter/src/widgets/text.dart:287:10)'),
  StackFrame(number: 3,  className: '_MyHomePageState',               method: 'build',          packageScheme: 'package', package: 'hello_flutter', packagePath: 'main.dart',                  line: 72,   column: 16,                      source: '#3      _MyHomePageState.build (package:hello_flutter/main.dart:72:16)'),
  StackFrame(number: 4,  className: 'StatefulElement',                method: 'build',          packageScheme: 'package', package: 'flutter',       packagePath: 'src/widgets/framework.dart', line: 4414, column: 27,                      source: '#4      StatefulElement.build (package:flutter/src/widgets/framework.dart:4414:27)'),
  StackFrame(number: 5,  className: 'ComponentElement',               method: 'performRebuild', packageScheme: 'package', package: 'flutter',       packagePath: 'src/widgets/framework.dart', line: 4303, column: 15,                      source: '#5      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4303:15)'),
  StackFrame(number: 6,  className: 'Element',                        method: 'rebuild',        packageScheme: 'package', package: 'flutter',       packagePath: 'src/widgets/framework.dart', line: 4027, column: 5,                       source: '#6      Element.rebuild (package:flutter/src/widgets/framework.dart:4027:5)'),
  StackFrame(number: 7,  className: 'ComponentElement',               method: '_firstBuild',    packageScheme: 'package', package: 'flutter',       packagePath: 'src/widgets/framework.dart', line: 4286, column: 5,                       source: '#7      ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4286:5)'),
  StackFrame(number: 8,  className: 'StatefulElement',                method: '_firstBuild',    packageScheme: 'package', package: 'flutter',       packagePath: 'src/widgets/framework.dart', line: 4461, column: 11,                      source: '#8      StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4461:11)'),
  StackFrame(number: 9,  className: 'ComponentElement',               method: 'mount',          packageScheme: 'package', package: 'flutter',       packagePath: 'src/widgets/framework.dart', line: 4281, column: 5,                       source: '#9      ComponentElement.mount (package:flutter/src/widgets/framework.dart:4281:5)'),
  StackFrame(number: 10, className: 'Element',                        method: 'inflateWidget',  packageScheme: 'package', package: 'flutter',       packagePath: 'src/widgets/framework.dart', line: 3276, column: 14,                      source: '#10     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3276:14)'),
  StackFrame(number: 11, className: 'Element',                        method: 'updateChild',    packageScheme: 'package', package: 'flutter',       packagePath: 'src/widgets/framework.dart', line: -1,   column: -1,                      source: '#11     Element.updateChild (package:flutter/src/widgets/framework.dart)'),
  StackFrame(number: 12, className: 'SingleChildRenderObjectElement', method: 'mount',          packageScheme: 'package', package: 'flutter',       packagePath: 'blah.dart',                  line: 999,  column: 9,                       source: '#12     SingleChildRenderObjectElement.mount (package:flutter/blah.dart:999:9)'),
  StackFrame(number: 13,                                              method: 'main',           packageScheme: 'package', package: 'hello_flutter', packagePath: 'main.dart',                  line: 10,   column: 4,                       source: '#13     main (package:hello_flutter/main.dart:10:4)'),
];


const String asyncStackString = '''
#0      getSampleStack.<anonymous closure> (file:///path/to/flutter/packages/flutter/test/foundation/error_reporting_test.dart:40:57)
#1      new Future.sync (dart:async/future.dart:224:31)
#2      getSampleStack (file:///path/to/flutter/packages/flutter/test/foundation/error_reporting_test.dart:40:10)
#3      main (file:///path/to/flutter/packages/flutter/test/foundation/error_reporting_test.dart:46:40)
#4      main (package:flutter_goldens/flutter_goldens.dart:43:17)
<asynchronous suspension>
#5      main.<anonymous closure>.<anonymous closure> (file:///temp/path.whatever/listener.dart:47:18)
#6      _rootRun (dart:async/zone.dart:1126:13)
#7      _CustomZone.run (dart:async/zone.dart:1023:19)
#8      _runZoned (dart:async/zone.dart:1518:10)
#9      runZoned (dart:async/zone.dart:1465:12)
#10     Declarer.declare (package:test_api/src/backend/declarer.dart:130:22)
#11     RemoteListener.start.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:test_api/src/remote_listener.dart:124:26)
<asynchronous suspension>
#12     _rootRun (dart:async/zone.dart:1126:13)
#13     _CustomZone.run (dart:async/zone.dart:1023:19)
#14     _runZoned (dart:async/zone.dart:1518:10)
#15     runZoned (dart:async/zone.dart:1502:12)
#16     RemoteListener.start.<anonymous closure>.<anonymous closure> (package:test_api/src/remote_listener.dart:70:9)
#17     _rootRun (dart:async/zone.dart:1126:13)
#18     _CustomZone.run (dart:async/zone.dart:1023:19)
#19     _runZoned (dart:async/zone.dart:1518:10)
#20     runZoned (dart:async/zone.dart:1465:12)
#21     StackTraceFormatter.asCurrent (package:test_api/src/backend/stack_trace_formatter.dart:41:31)
#22     RemoteListener.start.<anonymous closure> (package:test_api/src/remote_listener.dart:69:29)
#23     _rootRun (dart:async/zone.dart:1126:13)
#24     _CustomZone.run (dart:async/zone.dart:1023:19)
#25     _runZoned (dart:async/zone.dart:1518:10)
#26     runZoned (dart:async/zone.dart:1465:12)
#27     SuiteChannelManager.asCurrent (package:test_api/src/suite_channel_manager.dart:34:31)
#28     RemoteListener.start (package:test_api/src/remote_listener.dart:68:27)
#29     serializeSuite (file:///temp/path.whatever/listener.dart:17:25)
#30     main (file:///temp/path.whatever/listener.dart:43:36)
#31     _runMainZoned.<anonymous closure>.<anonymous closure> (dart:ui/hooks.dart:239:25)
#32     _rootRun (dart:async/zone.dart:1126:13)
#33     _CustomZone.run (dart:async/zone.dart:1023:19)
#34     _runZoned (dart:async/zone.dart:1518:10)
#35     runZoned (dart:async/zone.dart:1502:12)
#36     _runMainZoned.<anonymous closure> (dart:ui/hooks.dart:231:5)
#37     _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:307:19)
#38     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:174:12)''';

const String mangledStackString = r'''
dart:async/future_impl.dart 23:44                              _Completer.completeError
test\bindings_async_gap_test.dart 42:17                        main.<fn>.<fn>
package:flutter_test/src/binding.dart 744:19                   TestWidgetsFlutterBinding._runTestBody
===== asynchronous gap ===========================
dart:async/zone.dart 1121:19                                   _CustomZone.registerUnaryCallback
dart:async-patch/async_patch.dart 83:23                        _asyncThenWrapperHelper
dart:async/zone.dart 1222:13                                   _rootRunBinary
dart:async/zone.dart 1107:19                                   _CustomZone.runBinary
package:flutter_test/src/binding.dart 724:14                   TestWidgetsFlutterBinding._runTest
package:flutter_test/src/binding.dart 1124:24                  AutomatedTestWidgetsFlutterBinding.runTest.<fn>
package:fake_async/fake_async.dart 177:54                      FakeAsync.run.<fn>.<fn>
dart:async/zone.dart 1190:13                                   _rootRun
''';

const List<StackFrame> asyncStackFrames = <StackFrame>[
  StackFrame(number: 0,                                    method: 'getSampleStack', packageScheme: 'file',    package: '<unknown>',       packagePath: '/path/to/flutter/packages/flutter/test/foundation/error_reporting_test.dart', line: 40,   column: 57,                      source: '#0      getSampleStack.<anonymous closure> (file:///path/to/flutter/packages/flutter/test/foundation/error_reporting_test.dart:40:57)'),
  StackFrame(number: 1,  className: 'Future',              method: 'sync',           packageScheme: 'dart',    package: 'async',           packagePath: 'future.dart',                                                                 line: 224,  column: 31, isConstructor: true, source: '#1      new Future.sync (dart:async/future.dart:224:31)'),
  StackFrame(number: 2,                                    method: 'getSampleStack', packageScheme: 'file',    package: '<unknown>',       packagePath: '/path/to/flutter/packages/flutter/test/foundation/error_reporting_test.dart', line: 40,   column: 10,                      source: '#2      getSampleStack (file:///path/to/flutter/packages/flutter/test/foundation/error_reporting_test.dart:40:10)'),
  StackFrame(number: 3,                                    method: 'main',           packageScheme: 'file',    package: '<unknown>',       packagePath: '/path/to/flutter/packages/flutter/foundation/error_reporting_test.dart',      line: 46,   column: 40,                      source: '#3      main (file:///path/to/flutter/packages/flutter/test/foundation/error_reporting_test.dart:46:40)'),
  StackFrame(number: 4,                                    method: 'main',           packageScheme: 'package', package: 'flutter_goldens', packagePath: 'flutter_goldens.dart',                                                        line: 43,   column: 17,                      source: '#4      main (package:flutter_goldens/flutter_goldens.dart:43:17)'),
  StackFrame.asynchronousSuspension,
  StackFrame(number: 5,                                    method: 'main',           packageScheme: 'file',    package: '<unknown>',       packagePath: '/temp/path.whatever/listener.dart',                                           line: 47,   column: 18,                      source: '#5      main.<anonymous closure>.<anonymous closure> (file:///temp/path.whatever/listener.dart:47:18)'),
  StackFrame(number: 6,                                    method: '_rootRun',       packageScheme: 'dart',    package: 'async',           packagePath: 'zone.dart',                                                                   line: 1126, column: 13,                      source: '#6      _rootRun (dart:async/zone.dart:1126:13)'),
  StackFrame(number: 7,  className: '_CustomZone',         method: 'run',            packageScheme: 'dart',    package: 'async',           packagePath: 'zone.dart',                                                                   line: 1023, column: 19,                      source: '#7      _CustomZone.run (dart:async/zone.dart:1023:19)'),
  StackFrame(number: 8,                                    method: '_runZoned',      packageScheme: 'dart',    package: 'async',           packagePath: 'zone.dart',                                                                   line: 1518, column: 10,                      source: '#8      _runZoned (dart:async/zone.dart:1518:10)'),
  StackFrame(number: 9,                                    method: 'runZoned',       packageScheme: 'dart',    package: 'async',           packagePath: 'zone.dart',                                                                   line: 1465, column: 12,                      source: '#9      runZoned (dart:async/zone.dart:1465:12)'),
  StackFrame(number: 10, className: 'Declarer',            method: 'declare',        packageScheme: 'package', package: 'test_api',        packagePath: 'src/backend/declarer.dart',                                                   line: 130,  column: 22,                      source: '#10     Declarer.declare (package:test_api/src/backend/declarer.dart:130:22)'),
  StackFrame(number: 11, className: 'RemoteListener',      method: 'start',          packageScheme: 'package', package: 'test_api',        packagePath: 'src/remote_listener.dart',                                                    line: 124,  column: 26,                      source: '#11     RemoteListener.start.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:test_api/src/remote_listener.dart:124:26)'),
  StackFrame.asynchronousSuspension,
  StackFrame(number: 12,                                   method: '_rootRun',       packageScheme: 'dart',    package: 'async',           packagePath: 'zone.dart',                                                                   line: 1126, column: 13,                      source: '#12     _rootRun (dart:async/zone.dart:1126:13)'),
  StackFrame(number: 13, className: '_CustomZone',         method: 'run' ,           packageScheme: 'dart',    package: 'async',           packagePath: 'zone.dart',                                                                   line: 1023, column: 19,                      source: '#13     _CustomZone.run (dart:async/zone.dart:1023:19)'),
  StackFrame(number: 14,                                   method: '_runZoned',      packageScheme: 'dart',    package: 'async',           packagePath: 'zone.dart',                                                                   line: 1518, column: 10,                      source: '#14     _runZoned (dart:async/zone.dart:1518:10)'),
  StackFrame(number: 15,                                   method: 'runZoned',       packageScheme: 'dart',    package: 'async',           packagePath: 'zone.dart',                                                                   line: 1502, column: 12,                      source: '#15     runZoned (dart:async/zone.dart:1502:12)'),
  StackFrame(number: 16, className: 'RemoteListener',      method: 'start',          packageScheme: 'package', package: 'test_api',        packagePath: 'src/remote_listener.dart',                                                    line: 70,   column: 9,                       source: '#16     RemoteListener.start.<anonymous closure>.<anonymous closure> (package:test_api/src/remote_listener.dart:70:9)'),
  StackFrame(number: 17,                                   method: '_rootRun',       packageScheme: 'dart',    package: 'async',           packagePath: 'zone.dart',                                                                   line: 1126, column: 13,                      source: '#17     _rootRun (dart:async/zone.dart:1126:13)'),
  StackFrame(number: 18, className: '_CustomZone',         method: 'run',            packageScheme: 'dart',    package: 'async',           packagePath: 'zone.dart',                                                                   line: 1023, column: 19,                      source: '#18     _CustomZone.run (dart:async/zone.dart:1023:19)'),
  StackFrame(number: 19,                                   method: '_runZoned',      packageScheme: 'dart',    package: 'async',           packagePath: 'zone.dart',                                                                   line: 1518, column: 10,                      source: '#19     _runZoned (dart:async/zone.dart:1518:10)'),
  StackFrame(number: 20,                                   method: 'runZoned',       packageScheme: 'dart',    package: 'async',           packagePath: 'zone.dart',                                                                   line: 1465, column: 12,                      source: '#20     runZoned (dart:async/zone.dart:1465:12)'),
  StackFrame(number: 21, className: 'StackTraceFormatter', method: 'asCurrent',      packageScheme: 'package', package: 'test_api',        packagePath: 'src/backend/stack_trace_formatter.dart',                                      line: 41,   column: 31,                      source: '#21     StackTraceFormatter.asCurrent (package:test_api/src/backend/stack_trace_formatter.dart:41:31)'),
  StackFrame(number: 22, className: 'RemoteListener',      method: 'start',          packageScheme: 'package', package: 'test_api',        packagePath: 'src/remote_listener.dart',                                                    line: 69,   column: 29,                      source: '#22     RemoteListener.start.<anonymous closure> (package:test_api/src/remote_listener.dart:69:29)'),
  StackFrame(number: 23,                                   method: '_rootRun',       packageScheme: 'dart',    package: 'async',           packagePath: 'zone.dart',                                                                   line: 1126, column: 13,                      source: '#23     _rootRun (dart:async/zone.dart:1126:13)'),
  StackFrame(number: 24, className: '_CustomZone',         method: 'run',            packageScheme: 'dart',    package: 'async',           packagePath: 'zone.dart',                                                                   line: 1023, column: 19,                      source: '#24     _CustomZone.run (dart:async/zone.dart:1023:19)'),
  StackFrame(number: 25,                                   method: '_runZoned',      packageScheme: 'dart',    package: 'async',           packagePath: 'zone.dart',                                                                   line: 1518, column: 10,                      source: '#25     _runZoned (dart:async/zone.dart:1518:10)'),
  StackFrame(number: 26,                                   method: 'runZoned',       packageScheme: 'dart',    package: 'async',           packagePath: 'zone.dart',                                                                   line: 1465, column: 12,                      source: '#26     runZoned (dart:async/zone.dart:1465:12)'),
  StackFrame(number: 27, className: 'SuiteChannelManager', method: 'asCurrent',      packageScheme: 'package', package: 'test_api',        packagePath: 'src/suite_channel_manager.dart',                                              line: 34,   column: 31,                      source: '#27     SuiteChannelManager.asCurrent (package:test_api/src/suite_channel_manager.dart:34:31)'),
  StackFrame(number: 28, className: 'RemoteListener',      method: 'start',          packageScheme: 'package', package: 'test_api',        packagePath: 'src/remote_listener.dart',                                                    line: 68,   column: 27,                      source: '#28     RemoteListener.start (package:test_api/src/remote_listener.dart:68:27)'),
  StackFrame(number: 29,                                   method: 'serializeSuite', packageScheme: 'file',    package: '<unknown>',       packagePath: '/temp/path.whatever/listener.dart',                                           line: 17,   column: 25,                      source: '#29     serializeSuite (file:///temp/path.whatever/listener.dart:17:25)'),
  StackFrame(number: 30,                                   method: 'main',           packageScheme: 'file',    package: '<unknown>',       packagePath: '/temp/path.whatever/listener.dart',                                           line: 43,   column: 36,                      source: '#30     main (file:///temp/path.whatever/listener.dart:43:36)'),
  StackFrame(number: 31,                                   method: '_runMainZoned',  packageScheme: 'dart',    package: 'ui',              packagePath: 'hooks.dart',                                                                  line:239,   column: 25,                      source: '#31     _runMainZoned.<anonymous closure>.<anonymous closure> (dart:ui/hooks.dart:239:25)'),
  StackFrame(number: 32,                                   method: '_rootRun',       packageScheme: 'dart',    package: 'async',           packagePath: 'zone.dart',                                                                   line: 1126, column: 13,                      source: '#32     _rootRun (dart:async/zone.dart:1126:13)'),
  StackFrame(number: 33, className: '_CustomZone',         method: 'run' ,           packageScheme: 'dart',    package: 'async',           packagePath: 'zone.dart',                                                                   line: 1023, column: 19,                      source: '#33     _CustomZone.run (dart:async/zone.dart:1023:19)'),
  StackFrame(number: 34,                                   method: '_runZoned',      packageScheme: 'dart',    package: 'async',           packagePath: 'zone.dart',                                                                   line: 1518, column: 10,                      source: '#34     _runZoned (dart:async/zone.dart:1518:10)'),
  StackFrame(number: 35,                                   method: 'runZoned',       packageScheme: 'dart',    package: 'async',           packagePath: 'zone.dart',                                                                   line: 1502, column: 12,                      source: '#35     runZoned (dart:async/zone.dart:1502:12)'),
  StackFrame(number: 36,                                   method: '_runMainZoned',  packageScheme: 'dart',    package: 'ui',              packagePath: 'hooks.dart',                                                                  line: 231,  column: 5,                       source: '#36     _runMainZoned.<anonymous closure> (dart:ui/hooks.dart:231:5)'),
  StackFrame(number: 37,                                   method: '_startIsolate',  packageScheme: 'dart',    package: 'isolate-patch',   packagePath: 'isolate_patch.dart',                                                          line: 307,  column: 19,                      source: '#37     _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:307:19)'),
  StackFrame(number: 38, className: '_RawReceivePortImpl', method: '_handleMessage', packageScheme: 'dart',    package: 'isolate-patch',   packagePath: 'isolate_patch.dart',                                                          line: 174,  column: 12,                      source: '#38     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:174:12)'),
];

const String stackFrameNoCols = '''
#0      blah (package:assertions/main.dart:4)
#1      main (package:assertions/main.dart:8)
#2      _runMainZoned.<anonymous closure>.<anonymous closure> (dart:ui/hooks.dart:239)
#3      _rootRun (dart:async/zone.dart:1126)
#4      _CustomZone.run (dart:async/zone.dart:1023)
#5      _runZoned (dart:async/zone.dart:1518)
#6      runZoned (dart:async/zone.dart:1502)
#7      _runMainZoned.<anonymous closure> (dart:ui/hooks.dart:231)
#8      _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:307)
#9      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:174)''';

const List<StackFrame> stackFrameNoColsFrames = <StackFrame>[
  StackFrame(number: 0,                                    method: 'blah',           packageScheme: 'package', package: 'assertions',    packagePath: 'main.dart',          line: 4,    column: -1, source: '#0      blah (package:assertions/main.dart:4)'),
  StackFrame(number: 1,                                    method: 'main',           packageScheme: 'package', package: 'assertions',    packagePath: 'main.dart',          line: 8,    column: -1, source: '#1      main (package:assertions/main.dart:8)'),
  StackFrame(number: 2,                                    method: '_runMainZoned',  packageScheme: 'dart',    package: 'ui',            packagePath: 'hooks.dart',         line: 239,  column: -1, source: '#2      _runMainZoned.<anonymous closure>.<anonymous closure> (dart:ui/hooks.dart:239)'),
  StackFrame(number: 3,                                    method: '_rootRun',       packageScheme: 'dart',    package: 'async',         packagePath: 'zone.dart',          line: 1126, column: -1, source: '#3      _rootRun (dart:async/zone.dart:1126)'),
  StackFrame(number: 4,  className: '_CustomZone',         method: 'run',            packageScheme: 'dart',    package: 'async',         packagePath: 'zone.dart',          line: 1023, column: -1, source: '#4      _CustomZone.run (dart:async/zone.dart:1023)'),
  StackFrame(number: 5,                                    method: '_runZoned',      packageScheme: 'dart',    package: 'async',         packagePath: 'zone.dart',          line: 1518, column: -1, source: '#5      _runZoned (dart:async/zone.dart:1518)'),
  StackFrame(number: 6,                                    method: 'runZoned',       packageScheme: 'dart',    package: 'async',         packagePath: 'zone.dart',          line: 1502, column: -1, source: '#6      runZoned (dart:async/zone.dart:1502)'),
  StackFrame(number: 7,                                    method: '_runMainZoned',  packageScheme: 'dart',    package: 'ui',            packagePath: 'hooks.dart',         line: 231,  column: -1, source: '#7      _runMainZoned.<anonymous closure> (dart:ui/hooks.dart:231)'),
  StackFrame(number: 8,                                    method: '_startIsolate',  packageScheme: 'dart',    package: 'isolate-patch', packagePath: 'isolate-patch.dart', line: 307,  column: -1, source: '#8      _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:307)'),
  StackFrame(number: 9,  className: '_RawReceivePortImpl', method: '_handleMessage', packageScheme: 'dart',    package: 'isolate-patch', packagePath: 'isolate-patch.dart', line: 174,  column: -1, source: '#9      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:174)'),
];

const String webStackTrace = r'''
package:dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart 196:49  throw_
package:assertions/main.dart 4:3                                                      blah
package:assertions/main.dart 8:5                                                      main$
package:assertions/main_web_entrypoint.dart 9:3                                       main$
package:dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 47:50            onValue
package:dart-sdk/lib/async/zone.dart 1381:54                                          runUnary
object_test.dart 210:5                                                                performLayout
package:dart-sdk/lib/async/future_impl.dart 140:18                                    handleValue
package:dart-sdk/lib/async/future_impl.dart 682:44                                    handleValueCallback
package:dart-sdk/lib/async/future_impl.dart 711:32                                    _propagateToListeners
package:dart-sdk/lib/async/future_impl.dart 391:9                                     callback
package:dart-sdk/lib/async/schedule_microtask.dart 43:11                              _microtaskLoop
package:dart-sdk/lib/async/schedule_microtask.dart 52:5                               _startMicrotaskLoop
package:dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 168:15           <fn>''';

const List<StackFrame> webStackTraceFrames = <StackFrame>[
  StackFrame(number: -1, className: '<unknown>', method: 'throw_',                packageScheme: 'package',   package: 'dart-sdk',   packagePath: 'lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart', line: 196,  column: 49, source: 'package:dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart 196:49  throw_'),
  StackFrame(number: -1, className: '<unknown>', method: 'blah',                  packageScheme: 'package',   package: 'assertions', packagePath: 'main.dart',                                                    line: 4,    column: 3,  source: 'package:assertions/main.dart 4:3                                                      blah'),
  StackFrame(number: -1, className: '<unknown>', method: r'main$',                packageScheme: 'package',   package: 'assertions', packagePath: 'main.dart',                                                    line: 8,    column: 5,  source: r'package:assertions/main.dart 8:5                                                      main$'),
  StackFrame(number: -1, className: '<unknown>', method: r'main$',                packageScheme: 'package',   package: 'assertions', packagePath: 'main_web_entrypoint.dart',                                     line: 9,    column: 3,  source: r'package:assertions/main_web_entrypoint.dart 9:3                                       main$'),
  StackFrame(number: -1, className: '<unknown>', method: 'onValue',               packageScheme: 'package',   package: 'dart-sdk',   packagePath: 'lib/_internal/js_dev_runtime/patch/async_patch.dart',          line: 47,   column: 50, source: 'package:dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 47:50            onValue'),
  StackFrame(number: -1, className: '<unknown>', method: 'runUnary',              packageScheme: 'package',   package: 'dart-sdk',   packagePath: 'lib/async/zone.dart',                                          line: 1381, column: 54, source: 'package:dart-sdk/lib/async/zone.dart 1381:54                                          runUnary'),
  StackFrame(number: -1, className: '<unknown>', method: 'performLayout',         packageScheme: '<unknown>', package: '<unknown>',  packagePath: '<unknown>',                                                    line: 210,  column: 5,  source: 'object_test.dart 210:5                                                                performLayout'),
  StackFrame(number: -1, className: '<unknown>', method: 'handleValue',           packageScheme: 'package',   package: 'dart-sdk',   packagePath: 'lib/async/future_impl.dart',                                   line: 140,  column: 18, source: 'package:dart-sdk/lib/async/future_impl.dart 140:18                                    handleValue'),
  StackFrame(number: -1, className: '<unknown>', method: 'handleValueCallback',   packageScheme: 'package',   package: 'dart-sdk',   packagePath: 'lib/async/future_impl.dart',                                   line: 682,  column: 44, source: 'package:dart-sdk/lib/async/future_impl.dart 682:44                                    handleValueCallback'),
  StackFrame(number: -1, className: '<unknown>', method: '_propagateToListeners', packageScheme: 'package',   package: 'dart-sdk',   packagePath: 'lib/async/future_impl.dart',                                   line: 711,  column: 32, source: 'package:dart-sdk/lib/async/future_impl.dart 711:32                                    _propagateToListeners'),
  StackFrame(number: -1, className: '<unknown>', method: 'callback',              packageScheme: 'package',   package: 'dart-sdk',   packagePath: 'lib/async/future_impl.dart',                                   line: 391,  column: 9,  source: 'package:dart-sdk/lib/async/future_impl.dart 391:9                                     callback'),
  StackFrame(number: -1, className: '<unknown>', method: '_microtaskLoop',        packageScheme: 'package',   package: 'dart-sdk',   packagePath: 'lib/async/schedule_microtask.dart',                            line: 43,   column: 11, source: 'package:dart-sdk/lib/async/schedule_microtask.dart 43:11                              _microtaskLoop'),
  StackFrame(number: -1, className: '<unknown>', method: '_startMicrotaskLoop',   packageScheme: 'package',   package: 'dart-sdk',   packagePath: 'lib/async/schedule_microtask.dart',                            line: 52,   column: 5,  source: 'package:dart-sdk/lib/async/schedule_microtask.dart 52:5                               _startMicrotaskLoop'),
  StackFrame(number: -1, className: '<unknown>', method: '<fn>',                  packageScheme: 'package',   package: 'dart-sdk',   packagePath: 'lib/_internal/js_dev_runtime/patch/async_patch.dart',          line: 168,  column: 15, source: 'package:dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 168:15           <fn>'),
];
